// Listing 14.9 Implementing pure virtual functions
#include <iostream>
using namespace std;
class Shape {
public:
  Shape(){}
  virtual ~Shape(){}
  virtual long GetArea() = 0;
  virtual long GetPerim() = 0;
  virtual void Draw() = 0;
private:    
};

void Shape::Draw() {
  cout << "Abstract drawing mechanism!\n";  
}

class Circle : public Shape{
public:
  Circle(int radius):itsRadius(radius){}
  virtual ~Circle(){}
  long GetArea(){ return 3.14 * itsRadius * itsRadius; }
  long GetPerim() { return 2 * 3.14 * itsRadius; }
  void Draw();
private:
  int itsRadius;
  int itsCircumference;
};

void Circle::Draw() {
  cout << "Circle drawing routine here!\n";
  Shape::Draw();  
}

class Rectangle : public Shape {
public:
  Rectangle(int len, int width):
    itsLength(len),itsWidth(width){}
    virtual ~Rectangle(){}
    long GetArea() { return itsLength * itsWidth; }
    long GetPerim() { return 2 * itsLength + 2 * itsWidth; }
    virtual int GetLength() { return itsLength; }
    virtual int GetWidth() { return itsWidth; }
    void Draw();
private:
  int itsWidth;
  int itsLength;  
};